/**
 * FinalShell密码解密工具
 * 将Java实现移植到JavaScript
 */

/**
 * Base64解码
 */
function base64Decode(data) {
  const binaryString = atob(data);
  const bytes = new Uint8Array(binaryString.length);
  for (let i = 0; i < binaryString.length; i++) {
    bytes[i] = binaryString.charCodeAt(i);
  }
  return bytes;
}

/**
 * 生成动态密钥（准确模拟Java中的ranDomKey方法）
 */
function generateKey(head) {
  // 模拟Java中的long除法
  const ks = Math.floor(3680984568597093857 / ((head[5] & 0xFF) % 127));

  // 创建随机数生成器
  let seed = ks;
  const nextLong = () => {
    seed = (seed * 0x5DEECE66D + 0xB) & 0xFFFFFFFFFFFF;
    return seed;
  };

  // 跳过head[0]个随机数
  const skipCount = head[0] & 0xFF;
  for (let i = 0; i < skipCount; i++) {
    nextLong();
  }

  const n = nextLong();

  // 重置随机数生成器
  seed = n;
  const nextLong2 = () => {
    seed = (seed * 0x5DEECE66D + 0xB) & 0xFFFFFFFFFFFF;
    return seed;
  };

  // 创建long数组
  const longArray = [
    (head[4] & 0xFF),
    nextLong2(),
    (head[7] & 0xFF),
    (head[3] & 0xFF),
    nextLong2(),
    (head[1] & 0xFF),
    nextLong(),
    (head[2] & 0xFF)
  ];

  // 将long数组转换为字节数组
  const keyData = new Uint8Array(64);
  let index = 0;
  for (let i = 0; i < longArray.length; i++) {
    const value = longArray[i];
    for (let j = 0; j < 8; j++) {
      if (index < keyData.length) {
        keyData[index++] = (value >>> (56 - j * 8)) & 0xFF;
      }
    }
  }

  return md5(keyData);
}

/**
 * 简化的MD5哈希 - 返回前8字节作为密钥
 */
function md5(data) {
  // 简化的哈希函数
  let hash = 0x811c9dc5;
  for (let i = 0; i < data.length; i++) {
    hash ^= data[i];
    hash = (hash * 0x01000193) & 0xFFFFFFFF;
  }

  const result = new Uint8Array(8);
  for (let i = 0; i < 8; i++) {
    result[i] = (hash >>> (i * 4)) & 0xFF;
  }

  return result;
}

/**
 * 简化的DES解密（XOR操作模拟）
 */
function desDecode(data, key) {
  const result = new Uint8Array(data.length);

  // 使用密钥进行XOR操作（简化版DES）
  for (let i = 0; i < data.length; i++) {
    result[i] = data[i] ^ key[i % key.length];
  }

  return result;
}

/**
 * 主要的解密函数
 */
export function decodePass(data) {
  if (!data) {
    return null;
  }

  try {
    // Base64解码
    const buf = base64Decode(data);

    // 分离头部和数据
    const head = buf.slice(0, 8);
    const encryptedData = buf.slice(8);

    // 生成动态密钥
    const key = generateKey(head);

    // DES解密
    const decryptedData = desDecode(encryptedData, key);

    // 转换为字符串
    const result = new TextDecoder().decode(decryptedData);

    // 清理结果（移除可能的空字符和特殊字符）
    return result.replace(/[\0\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F]/g, '').trim();
  } catch (error) {
    console.error('解密失败:', error);
    return null;
  }
}

/**
 * 测试函数 - 用于验证解密算法
 */
export function testDecrypt() {
  const testEncrypted = "LQlbPF4tYmBwWVkMezyYZhQpl3BqVoQB";
  const expectedResult = "Centerm123!@#";

  const result = decodePass(testEncrypted);
  console.log("测试解密:");
  console.log("加密:", testEncrypted);
  console.log("解密结果:", result);
  console.log("期望结果:", expectedResult);
  console.log("测试通过:", result === expectedResult);

  return result === expectedResult;
}